// 版权所有2009 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package runtime

import (
	"runtime/internal/atomic"
	"unsafe"
)

// GOMAXPROCS设置可同时执行的最大CPU数
// 并返回上一个设置。默认为
// runtime.numpu的值。如果n<1，则不会改变当前设置。
// 当调度程序改进时，此调用将消失。
func GOMAXPROCS(n int) int {
	if GOARCH == "wasm" && n > 1 {
		n = 1 // WebAssembly还没有线程，因此只能使用一个CPU。
	}

	lock(&sched.lock)
	ret := int(gomaxprocs)
	unlock(&sched.lock)
	if n <= 0 || n == ret {
		return ret
	}

	stopTheWorldGC("GOMAXPROCS")

	// 新进程将由Start处理世界
	newprocs = int32(n)

	startTheWorldGC()
	return ret
}

// NumCPU返回当前进程可用的逻辑CPU数量。
// 
// 在进程启动时通过查询操作系统
// 检查可用CPU集。
// 进程启动后对操作系统CPU分配的更改未反映出来。
func NumCPU() int {
	return int(ncpu)
}

// numgocall返回当前进程进行的cgo调用数。
func NumCgoCall() int64 {
	var n = int64(atomic.Load64(&ncgocall))
	for mp := (*m)(atomic.Loadp(unsafe.Pointer(&allm))); mp != nil; mp = mp.alllink {
		n += int64(mp.ncgocall)
	}
	return n
}

// NumGoroutine返回当前存在的goroutine数。
func NumGoroutine() int {
	return int(gcount())
}

// go:linkname debug\u modinfo runtime/debug.modinfo 
func debug_modinfo() string {
	return modinfo
}
